(** Types des AST et des valeurs pour le langage WHILE *)

(** {2 Types des AST pour le langage WHILE} *)

(** Type des variables WHILE *)
type var = Var of string

(** Type des expressions WHILE *)
type expr =
  | Expr_Num of int
  | Expr_Neg of expr
  | Expr_Var of var
  | Expr_Bool of bool
  | Expr_Plus of (expr * expr)
  | Expr_Minus of (expr * expr)
  | Expr_Mult of (expr * expr)
  | Expr_Div of (expr * expr)
  | Expr_Pow of (expr * expr)
  | Expr_Equal of (expr * expr)
  | Expr_Less of (expr * expr)
  | Expr_And of (expr * expr)
  | Expr_Or of (expr * expr)
  | Expr_Not of (expr)
  | Expr_NotEqual of (expr * expr)
  | Expr_LessEqual of (expr * expr)
  | Expr_Greater of (expr * expr)
  | Expr_GreaterEqual of (expr * expr)
  | Expr_Unsupported

(** Type des programmes WHILE *)
type prog =
  | Skip of (int)
  | Assign of (var * expr * int)
  | Seq of (prog * prog)
  | If of (expr * prog * prog * int)
  | While of (expr * prog * int)
  | Unsupported

(** {2 Valeurs sémantiques de WHILE} *)

(** Type des valeurs WHILE *)
type value = Int of int | Bool of bool

(** Type pour l'analyse des variables actives
  ln_elt = {lbl: int ;      --> label de l'instruction
            _in: var list ; --> liste des variables en entrée de l'instruction
            out: var list   --> liste des variables en sortie de l'instruction
          }
*)
type liveness = Liveness of ln_elt and ln_elt =  {lbl: int ; _in: var list ; out: var list}

(** Type pour l'analyse des expressions disponibles
  ae_elt = {lbl: int ;                --> label de l'instruction
            _in: (var * expr) list ;  --> liste des couples variables, expressions en entrée de l'instruction
            out: (var * expr) list    --> liste des couples variables, expressions en sortie de l'instruction
          }
*)
type avail_expr = AvailExpr of ae_elt and ae_elt = {lbl: int ; _in: (var * expr) list ; out: (var * expr) list }

type priority =
  | Prio_MIN
  | Prio_Assign
  | Prio_Or
  | Prio_And
  | Prio_Comp
  | Prio_Plus
  | Prio_Minus
  | Prio_Mult
  | Prio_Div
  | Prio_Pow
  | Prio_Unary
  | Prio_MAX

(** {2 Autres particularités du parser} *)

(** Compteur pour les labels des instructions *)
let counter = ref 0
